openapi: 3.1.0
info:
  title: Cloud Storage Open API
  description: >
    Керування файлами, вивантаженнями, видаленнями та мітками файлів хмарного
    сховища MoreLogin через MoreLogin Open API.


    **Базовий URL**: `https://api.morelogin.com`


    Автентифікація виконується bearer-токеном OAuth2. Докладніше див.
    [Автентифікація](../Getting%20Started/authentication.md).
  version: '2026-09-05'
servers:
  - url: https://api.morelogin.com
tags:
  - name: Cloud Storage
    description: Запит квоти та використання сховища
  - name: Cloud Storage Files
    description: Запит, завантаження та видалення файлів хмарного сховища
  - name: Cloud Storage File Tags
    description: Керування тегами файлів хмарного сховища
x-tagGroups:
  - name: Cloud Storage
    tags:
      - Cloud Storage
      - Cloud Storage Files
      - Cloud Storage File Tags
paths:
  /cloudstorage/info:
    get:
      summary: Запит інформації про хмарне сховище
      description: >-
        Повертає квоту хмарного сховища команди та поточне використання.

        - **Передумови**: команда вже має мати запис хмарного сховища.
        **Команда, якій хмарне сховище ніколи не виділялося, отримає помилку, а
        не нульову ємність** — запис створюється під час покупки сховища, а не
        відкладено цим викликом.

        - **Ефект**: відсутній. Лише читання. Повтор безпечний з обмеженою
        витримкою.

        - **Одиниці**: `capacity` і `usedCapacity` — кількість байтів.

        - **Точність**: `usedCapacity` — накопичувальний лічильник, що
        оновлюється під час вивантаження та видалення, а не сума, яка
        обчислюється за таблицею файлів у момент запиту, тому він може
        розходитися із сумою `fileSize` у `/cloudstorage/file/page`.

        - **Значення**: `capacityStatus` дорівнює `1` лише коли позитивна квота
        вичерпана повністю; `isExpired` порівнює дату спливання з поточним
        моментом. Файли, вивантаження яких не було підтверджено, у
        `usedCapacity` не враховуються.


        Задокументовані бізнес-помилки: `39001`. Значення кодів див. у [Error
        Codes](../Getting%20Started/error-codes.md). Будь-яка операція може
        додатково повернути загальні коди.
      operationId: queryCloudStorageInfo
      tags:
        - Cloud Storage
      responses:
        '200':
          $ref: '#/components/responses/StorageInfoResponse'
  /cloudstorage/file/page:
    post:
      summary: Посторінковий список файлів хмарного сховища
      description: >-
        Посторінково виводить файли Cloud Storage.

        - **Ефект**: відсутній. Лише читання. Повтор безпечний з обмеженою
        витримкою.

        - **Видимість**: **виводяться лише файли, вивантаження яких
        підтверджено**: файл із передпідписаним URL, вивантаження якого так і не
        було завершено, не з'явиться. Учасники без права на всі дані бачать лише
        вивантажені ними файли.

        - **Фільтрація**: `fileName` зіставляється частково; `tagIds` працює за
        логікою АБО; результати впорядковані від нових до старих, і цей порядок
        змінити неможливо.

        - **Особливість**: елемент `tagInfo` може дорівнювати null, якщо мітку
        було видалено, доки вона ще була прив'язана до файлу.
      operationId: pageCloudStorageFiles
      tags:
        - Cloud Storage Files
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FilePageRequest'
            example:
              pageNo: 1
              pageSize: 20
              fileName: report
              tagIds:
                - '1800000000000001'
      responses:
        '200':
          $ref: '#/components/responses/FilePageResponse'
  /cloudstorage/upload/init:
    post:
      summary: Пакетний запит попередньо підписаних URL для завантаження
      description: >-
        Резервує записи у хмарному сховищі та видає передпідписані URL для
        вивантаження.

        - **Передумови**: команда має мати запис хмарного сховища, і він не має
        бути протермінованим. Базове імʼя кожного файлу обмежене 60 символами й
        має бути унікальним як у межах запиту, так і щодо всіх наявних файлів
        команди — **звірка йде за імʼям без розширення**, тому `a.png`
        конфліктує з наявним `a.mp4`.

        - **Обмеження**: одночасно в команді може бути не більше 100
        непідтверджених вивантажень.

        - **Ефект**: вставляє по одному запису на імʼя зі статусом
        «вивантажується» та нульовим розміром і повертає `{id, fileName,
        presignedUrl}` для кожного.

        - **Квота**: **вільне місце тут не перевіряється.** Воно списується під
        час підтвердження вивантаження, тому init може пройти, а complete все
        одно впасти через нестачу місця.

        - **Завершення**: синхронне. **Кожен передпідписаний URL дійсний одну
        годину**; надішліть байти методом `PUT`, а потім викличте
        `/cloudstorage/upload/complete`.


        Задокументовані бізнес-помилки: `39001`, `39037`, `39044`, `39045`,
        `39047`, `39050`, `39051`. Значення кодів див. у [Error
        Codes](../Getting%20Started/error-codes.md). Будь-яка операція може
        додатково повернути загальні коди.
      operationId: batchRequestCloudStoragePresignedUploadUrls
      tags:
        - Cloud Storage Files
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UploadInitRequest'
            example:
              fileNames:
                - example.jpg
                - docs/report.pdf
      responses:
        '200':
          $ref: '#/components/responses/UploadInitResponse'
  /cloudstorage/upload/complete:
    post:
      summary: Підтвердження завершення завантаження
      description: >-
        Підтверджує вивантажений файл хмарного сховища.

        - **Передумови**: запис файлу має належати вашій команді, а обʼєкт уже
        має бути у сховищі — служба читає його ETag і довжину для перевірки.
        Розмір має бути більшим за 0 і меншим за 2 ГБ.

        - **Ефект**: атомарно списує квоту сховища команди, потім позначає запис
        вивантаженим і зберігає реальний розмір. Поки це не вдалося, файл **не
        зʼявляється у `/cloudstorage/file/page`** і продовжує займати один зі
        100 непідтверджених слотів.

        - **У разі помилки вивантажений обʼєкт видаляється.** Надто ранній
        виклик, перевищення межі розміру або нестача місця видаляють байти зі
        сховища й залишають запис непідтвердженим. Відновлення — це новий
        `/cloudstorage/upload/init` і повторне вивантаження, а не повтор цього
        виклику.

        - **Завершення**: синхронне й ідемпотентне після успіху — другий виклик
        поверне той самий файл, не списуючи квоту повторно.

        - **Примітка**: запис, який так і не підтвердили, автоматично
        прибирається через 24 години.


        Задокументовані бізнес-помилки: `39001`, `39011`, `39014`, `39041`,
        `39046`, `39047`. Значення кодів див. у [Error
        Codes](../Getting%20Started/error-codes.md). Будь-яка операція може
        додатково повернути загальні коди.
      operationId: confirmCloudStorageUploadComplete
      tags:
        - Cloud Storage Files
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UploadCompleteRequest'
            example:
              id: '1800000000000001'
      responses:
        '200':
          $ref: '#/components/responses/UploadCompleteResponse'
  /cloudstorage/file/delete/batch:
    post:
      summary: Пакетне видалення файлів хмарного сховища
      description: >-
        Видаляє файли Cloud Storage за ідентифікаторами.

        - **Передумови**: усі ідентифікатори мають розв'язуватися в межах вашої
        команди; **якщо хоча б один не розв'язується, весь пакет відхиляється й
        відкочується**, включно з ідентифікаторами, які вже було видалено.

        - **Ефект**: це логічне видалення. Квота звільняється в тій самій
        транзакції, а збережені об'єкти видаляються за можливості: збій сховища
        записується в лог, але не призводить до помилки виклику, тому об'єкт
        може пережити свій запис. Прив'язки міток не очищаються.

        - **Завершення**: синхронне. Звільнене місце підтвердьте через
        `/cloudstorage/info`.


        Задокументовані бізнес-помилки: `39011`. Значення кодів див. у [Error
        Codes](../Getting%20Started/error-codes.md). Будь-яка операція може
        додатково повернути загальні коди.
      operationId: batchDeleteCloudStorageFiles
      tags:
        - Cloud Storage Files
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FileDeleteRequest'
            example:
              ids:
                - '1800000000001001'
                - '1800000000001002'
      responses:
        '200':
          $ref: '#/components/responses/VoidDataResponse'
  /cloudstorage/file/tag/set:
    post:
      summary: Задати мітки файлу
      description: >-
        Замінює мітки у файлу Cloud Storage.

        - **Передумови**: один `fileId` на виклик, а `tagIds` не має бути
        порожнім і має посилатися на мітки Cloud Storage, що належать вашій
        команді. Мітки профілів відхиляються.

        - **Ефект**: мітки, відсутні в запиті, знімаються з файлу, а ті, яких
        бракує, додаються. **Зняти тут усі мітки неможливо**, бо порожній список
        відхиляється.

        - **Завершення**: синхронне й ідемпотентне за однакового тіла запиту.


        Задокументовані бізнес-помилки: `39011`, `39048`, `39049`. Значення
        кодів див. у [Error Codes](../Getting%20Started/error-codes.md).
        Будь-яка операція може додатково повернути загальні коди.
      operationId: setCloudStorageFileTags
      tags:
        - Cloud Storage File Tags
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FileTagChangeRequest'
            example:
              fileId: '1800000000001001'
              tagIds:
                - '1800000000000101'
                - '1800000000000102'
      responses:
        '200':
          $ref: '#/components/responses/VoidDataResponse'
  /cloudstorage/file/tag/add:
    post:
      summary: Додати мітки файлу
      description: >-
        Додає мітки до файлу Cloud Storage, не знімаючи наявних.

        - **Передумови**: один `fileId` на виклик, а `tagIds` не має бути
        порожнім і має посилатися на мітки Cloud Storage, що належать вашій
        команді.

        - **Ефект**: лише додає; наявні мітки залишаються на місці. Для заміни
        використовуйте варіант із повним встановленням.

        - **Завершення**: синхронне й ідемпотентне — додавання мітки, яку файл
        уже має, нічого не змінює.


        Задокументовані бізнес-помилки: `39011`, `39048`, `39049`. Значення
        кодів див. у [Error Codes](../Getting%20Started/error-codes.md).
        Будь-яка операція може додатково повернути загальні коди.
      operationId: addCloudStorageFileTags
      tags:
        - Cloud Storage File Tags
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FileTagChangeRequest'
            example:
              fileId: '1800000000001001'
              tagIds:
                - '1800000000000103'
      responses:
        '200':
          $ref: '#/components/responses/VoidDataResponse'
  /cloudstorage/file/tag/query:
    post:
      summary: Запитати мітки файлу
      description: >-
        Повертає мітки, прив'язані до одного або кількох файлів Cloud Storage.

        - **Передумови**: усі `fileId` мають розв'язуватися в межах вашої
        команди; **один невідомий ідентифікатор призводить до помилки всього
        виклику**, а не до часткових даних.

        - **Ефект**: відсутній. Лише читання. Повтор безпечний з обмеженою
        витримкою.

        - **Особливість**: `tagIds` читається з прив'язок, а подробиці міток
        беруться з наявних міток, тому мітка, видалена за збереженої прив'язки,
        потрапить до `tagIds` без відповідного запису в подробицях. Довжини двох
        списків можуть різнитися.
      operationId: queryCloudStorageFileTags
      tags:
        - Cloud Storage File Tags
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FileTagQueryRequest'
            example:
              fileIds:
                - '1800000000001001'
      responses:
        '200':
          $ref: '#/components/responses/FileTagsResponse'
  /cloudstorage/tag/all:
    get:
      summary: Запитати всі мітки файлів Cloud Storage
      description: >-
        Повертає всі мітки файлів Cloud Storage в команді.

        - **Ефект**: відсутній. Лише читання. Повтор безпечний з обмеженою
        витримкою.

        - **Примітка**: пагінації немає, і в міток Cloud Storage немає
        серверного обмеження за кількістю, тому відповідь зростає разом із
        числом міток, які створює ваша команда.
      operationId: queryAllCloudStorageFileTags
      tags:
        - Cloud Storage File Tags
      responses:
        '200':
          $ref: '#/components/responses/TagListResponse'
  /cloudstorage/tag/create:
    post:
      summary: Створити мітку файлу Cloud Storage
      description: >-
        Створює мітку файлу Cloud Storage.

        - **Передумови**: `tagName` не має бути порожнім.

        - **Ефект**: створює мітку з кольором, вибраним із фіксованої палітри.
        **Перевірки на дублювання назви немає, обмеження за кількістю теж
        немає**, тому повторний виклик створить другу мітку з тією самою назвою.

        - **Завершення**: синхронне; відповідь містить нову мітку.
      operationId: createCloudStorageFileTag
      tags:
        - Cloud Storage File Tags
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TagCreateRequest'
            example:
              tagName: Invoice
      responses:
        '200':
          $ref: '#/components/responses/TagResponse'
  /cloudstorage/tag/edit:
    post:
      summary: Змінити мітку файлу Cloud Storage
      description: >-
        Перейменовує мітку файлу Cloud Storage.

        - **Передумови**: мітка має існувати у вашій команді й бути міткою Cloud
        Storage.

        - **Ефект**: змінюється лише назва; колір і всі наявні прив'язки
        зберігаються, тому файли одразу показують нову назву.

        - **Завершення**: синхронне. Оптимістичного блокування немає — за
        одночасних перейменувань перемагає останній запис.
      operationId: editCloudStorageFileTag
      tags:
        - Cloud Storage File Tags
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TagEditRequest'
            example:
              id: '1800000000000101'
              tagName: Invoice 2026
      responses:
        '200':
          $ref: '#/components/responses/BooleanDataResponse'
  /cloudstorage/tag/delete/batch:
    post:
      summary: Видалити мітки файлів Cloud Storage
      description: >-
        Видаляє мітки файлів Cloud Storage.

        - **Передумови**: усі ідентифікатори мають бути мітками Cloud Storage
        вашої команди; **один недопустимий ідентифікатор призводить до помилки
        всього пакета**.

        - **Ефект**: мітки видаляються, але **їхні прив'язки до файлів не
        очищаються**. Очікуйте два наслідки: `/cloudstorage/file/tag/query` і
        далі повертатиме ідентифікатор видаленої мітки без відповідних
        подробиць, а `tagInfo` у `/cloudstorage/file/page` може містити елементи
        null. Фільтрація файлів за ідентифікатором видаленої мітки нічого не
        поверне.

        - **Завершення**: синхронне й не обгорнуте в транзакцію.
      operationId: deleteCloudStorageFileTags
      tags:
        - Cloud Storage File Tags
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TagDeleteRequest'
            example:
              ids:
                - '1800000000000101'
                - '1800000000000102'
      responses:
        '200':
          $ref: '#/components/responses/BooleanDataResponse'
components:
  securitySchemes:
    Authorization:
      type: http
      scheme: bearer
      bearerFormat: JWT
  schemas:
    ApiResponseBase:
      type: object
      properties:
        code:
          type: integer
          description: Код результату. `0` означає успіх; інші коди вказують на помилку.
          example: 0
        msg:
          type:
            - string
            - 'null'
          description: Повідомлення про помилку.
          example: null
        requestId:
          type: string
          description: >-
            ID запиту операції. Це поле може бути присутнім, якщо запит пройшов
            через API-шлюз.
          example: 1d4f3ea968664593860b94b35d4ebf5e
      required:
        - code
        - msg
    StorageInfo:
      type: object
      properties:
        capacity:
          type: string
          description: Загальна ємність хмарного сховища в байтах.
          example: '10737418240'
        usedCapacity:
          type: string
          description: Використана ємність хмарного сховища в байтах.
          example: '536870912'
        expireDate:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$
          description: Дата спливання хмарного сховища.
        capacityStatus:
          type: integer
          description: 'Статус ємності: 0 = норма, 1 = заповнено.'
          example: 0
        isExpired:
          type: boolean
          description: Чи сплив тарифний план підписки.
          example: false
    CloudStorageFile:
      type: object
      properties:
        id:
          type: string
          description: Ідентифікатор файла у хмарному сховищі.
          example: '1800000000001001'
        fileName:
          type: string
          description: Ім'я файлу (без розширення).
          example: example
        fileExt:
          type: string
          description: Розширення файлу.
          example: jpg
        fileSize:
          type: string
          description: Розмір файлу в байтах.
          example: '204800'
        fileType:
          type: integer
          description: >-
            Тип файлу: 0 = зображення, 1 = відео, 2 = застосунок, 3 = аудіо, 4 =
            документ, 5 = інше.
          example: 0
        tagInfo:
          type: array
          description: Подробиці міток, прив'язаних до файлу.
          items:
            $ref: '#/components/schemas/TagInfo'
        createDate:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$
          description: Дата вивантаження.
        updateDate:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$
          description: Дата оновлення.
    TagInfo:
      type: object
      properties:
        id:
          type: string
          description: Ідентифікатор тегу.
          example: '1800000000000101'
        tagSource:
          type: string
          description: Джерело мітки, наприклад ENV, PROXY.
          example: ENV
        tagName:
          type: string
          description: Назва тегу.
          example: Invoice
        tagType:
          type: string
          description: 'Тип мітки: TAG або GROUP.'
          example: TAG
        tagIcon:
          type: string
          description: Іконка мітки.
          example: ''
    FilePageRequest:
      type: object
      properties:
        pageNo:
          type: integer
          description: Номер поточної сторінки, починаючи з 1. За замовчуванням 1.
          minimum: 1
          default: 1
          example: 1
        pageSize:
          type: integer
          description: Кількість елементів на сторінці. За замовчуванням 10.
          minimum: 1
          default: 10
          example: 20
        fileName:
          type: string
          description: Ключове слово імені файлу для нечіткого пошуку.
          example: report
        tagIds:
          type: array
          description: Фільтрує файли за ID міток.
          items:
            type: string
          example:
            - '1800000000000101'
        fileType:
          type: integer
          description: >-
            Фільтр за типом файлу: 0 = зображення, 1 = відео, 2 = застосунок, 3
            = аудіо, 4 = документ, 5 = інше.
          example: 0
        fileIds:
          type: array
          description: Фільтрує файли за ID файлів.
          items:
            type: string
          example:
            - '1800000000001001'
    FilePageData:
      type: object
      properties:
        current:
          type: string
          example: '1'
        pages:
          type: string
          example: '7'
        total:
          type: string
          example: '128'
        dataList:
          type: array
          items:
            $ref: '#/components/schemas/CloudStorageFile'
      required:
        - current
        - pages
        - total
        - dataList
    UploadInitRequest:
      type: object
      properties:
        fileNames:
          type: array
          minItems: 1
          description: >-
            Список імен файлів для вивантаження (з розширенням), наприклад
            photo.jpg, video.mp4.
          items:
            type: string
          example:
            - photo.jpg
            - video.mp4
      required:
        - fileNames
    UploadInitResult:
      type: object
      properties:
        id:
          type: string
          description: Ідентифікатор файла у хмарному сховищі.
          example: '1800000000000001'
        fileName:
          type: string
          description: Ім'я файлу (з розширенням).
          example: photo.jpg
        presignedUrl:
          type: string
          description: >-
            Передпідписаний URL S3 для вивантаження. Використовуйте HTTPS PUT,
            щоб вивантажити вміст файлу.
          example: https://example.com/presigned-upload-url
    UploadCompleteRequest:
      type: object
      properties:
        id:
          type: string
          description: >-
            ID файлу Cloud Storage, повернений API передпідписаного URL для
            вивантаження.
          example: '1800000000000001'
      required:
        - id
    FileDeleteRequest:
      type: object
      properties:
        ids:
          type: array
          minItems: 1
          items:
            type: string
          description: ID файлів Cloud Storage для видалення.
          example:
            - '1800000000001001'
            - '1800000000001002'
      required:
        - ids
    FileTagChangeRequest:
      type: object
      properties:
        fileId:
          type: string
          description: Ідентифікатор файла у хмарному сховищі.
          example: '1800000000001001'
        tagIds:
          type: array
          minItems: 1
          items:
            type: string
          description: Ідентифікатори тегів.
          example:
            - '1800000000000101'
            - '1800000000000102'
      required:
        - fileId
        - tagIds
    FileTagQueryRequest:
      type: object
      properties:
        fileIds:
          type: array
          minItems: 1
          items:
            type: string
          description: ID файлів Cloud Storage.
          example:
            - '1800000000001001'
      required:
        - fileIds
    FileTagResultData:
      type: object
      properties:
        fileId:
          type: string
          description: Ідентифікатор файла у хмарному сховищі.
          example: '1800000000001001'
        tagIds:
          type: array
          items:
            type: string
          description: ID міток, прив'язаних до файлу.
          example:
            - '1800000000000101'
        tagInfo:
          type: array
          description: Подробиці міток.
          items:
            $ref: '#/components/schemas/TagInfo'
    TagCreateRequest:
      type: object
      properties:
        tagName:
          type: string
          description: Назва тегу.
          example: Invoice
      required:
        - tagName
    TagEditRequest:
      type: object
      properties:
        id:
          type: string
          description: Ідентифікатор тегу.
          example: '1800000000000101'
        tagName:
          type: string
          description: Назва тегу.
          example: Invoice 2026
      required:
        - id
        - tagName
    TagDeleteRequest:
      type: object
      properties:
        ids:
          type: array
          minItems: 1
          items:
            type: string
          description: ID міток для видалення.
          example:
            - '1800000000000101'
      required:
        - ids
  responses:
    StorageInfoResponse:
      description: Успіх
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/ApiResponseBase'
              - type: object
                properties:
                  data:
                    $ref: '#/components/schemas/StorageInfo'
                required:
                  - data
    FilePageResponse:
      description: Успіх
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/ApiResponseBase'
              - type: object
                properties:
                  data:
                    $ref: '#/components/schemas/FilePageData'
                required:
                  - data
    UploadInitResponse:
      description: Успіх
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/ApiResponseBase'
              - type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/UploadInitResult'
                required:
                  - data
    UploadCompleteResponse:
      description: Успіх
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/ApiResponseBase'
              - type: object
                properties:
                  data:
                    $ref: '#/components/schemas/CloudStorageFile'
                required:
                  - data
    VoidDataResponse:
      description: Успіх
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/ApiResponseBase'
              - type: object
                properties:
                  data:
                    type: 'null'
                    example: null
    BooleanDataResponse:
      description: Успіх
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/ApiResponseBase'
              - type: object
                properties:
                  data:
                    type: boolean
                    example: true
                required:
                  - data
    FileTagsResponse:
      description: Успіх
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/ApiResponseBase'
              - type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/FileTagResultData'
                required:
                  - data
    TagListResponse:
      description: Успіх
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/ApiResponseBase'
              - type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/TagInfo'
                required:
                  - data
    TagResponse:
      description: Успіх
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/ApiResponseBase'
              - type: object
                properties:
                  data:
                    $ref: '#/components/schemas/TagInfo'
                required:
                  - data
security:
  - Authorization: []
